package com.cnbot.toolkit.date;

import android.text.TextUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 *  @项目名：  ToolKitModel
 *  @包名：    com.cnbot.toolkit.date
 *  @文件名:   DateTool
 *  @创建者:   ww
 *  @创建时间:  2019/11/13 18:06
 *  @描述：    日期操作工具类
 */
public final class DateTool {

	private DateTool() {}

	public interface Pattern {
		/**
		 * 年月（六位）
		 */
		String YYYY_MM = "yyyy-MM";
		/**
		 * 时分
		 */
		String HH_MM = "HH:mm";
		/**
		 * 时分秒
		 */
		String HH_MM_SS = "HH:mm:ss";

		/**
		 * 秒
		 */
		String SS = "ss";
		/**
		 * 年月日（八位）
		 */
		String YYYY_MM_DD = "yyyy-MM-dd";
		/**
		 * 年月日时分（十二位）
		 */
		String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
		/**
		 * 年月日时分秒（十四位）
		 */
		String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2YMDHMS() {
		return millis2YMDHMS(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2YMDHMS(long millis) {
		return millis2String(millis, Pattern.YYYY_MM_DD_HH_MM_SS);
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2YMDHM() {
		return millis2YMDHM(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2YMDHM(long millis) {
		return millis2String(millis, Pattern.YYYY_MM_DD_HH_MM);
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2YMD() {
		return millis2YMD(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2YMD(long millis) {
		return millis2String(millis, Pattern.YYYY_MM_DD);
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2YM() {
		return millis2YM(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2YM(long millis) {
		return millis2String(millis, Pattern.YYYY_MM);
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2HMS() {
		return millis2HMS(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2HMS(long millis) {
		return millis2String(millis, Pattern.HH_MM_SS);
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2S() {
		return millis2S(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2S(long millis) {
		return millis2String(millis, Pattern.SS);
	}

	/**
	 * 当前时间毫秒值格式化
	 * @return
	 */
	public static String millis2HM() {
		return millis2HM(System.currentTimeMillis());
	}

	/**
	 * 指定时间毫秒值格式化
	 * @return
	 */
	public static String millis2HM(long millis) {
		return millis2String(millis, Pattern.HH_MM);
	}

	/**
	 * 指定格式对当前时间毫秒值进行格式化
	 * @return
	 */
	public static String millis2String(String pattern) {
		return millis2String(System.currentTimeMillis(), pattern);
	}

	/**
	 * 指定时间毫秒值和格式进行格式化
	 * @param millis
	 * @param pattern
	 *
	 * @return
	 */
	public static String millis2String(long millis, String pattern) {
		Date curDate = new Date(millis);
		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		return formatter.format(curDate);
	}

	/**
	 * 将日期字符串解析为毫秒值
	 * @param timeStr
	 * @param pattern
	 *
	 * @return
	 */
	public static long string2Millis(String timeStr, String pattern) {
		Date date = string2Date(timeStr, pattern);
		if (date == null) {
			return -1;
		}
		return date.getTime();
	}

	/**
	 * 将日期字符串解析为Date
	 * @param timeStr
	 * @param pattern
	 *
	 * @return
	 */
	public static Date string2Date(String timeStr, String pattern) {
		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		try {
			return formatter.parse(timeStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取当前日期的星期
	 * @return
	 */
	public static String getDayOfWeek() {
		final String[] weekArrays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		return getDayOfWeek(weekArrays);
	}

	/**
	 * 获取当前日期的星期
	 * @param weekArrays 指定星期的称呼，必须包含7个元素
	 * @return
	 */
	public static String getDayOfWeek(String[] weekArrays) {
		if (weekArrays == null || weekArrays.length != 7) {
			return "";
		}
		Calendar calendar = Calendar.getInstance();
		int week = calendar.get(Calendar.DAY_OF_WEEK);
		return weekArrays[week - 1];
	}

	/**
	 * 计算指定的时间毫秒值与当前时间的毫秒值是否大于指定的天数
	 * @param millis 指定的时间毫秒值
	 * @param limit 指定的天数
	 * @return true:大于等于指定天数
	 */
	public static boolean compareDay(long millis, int limit) {
		long current = System.currentTimeMillis();
		int day = (int) ((current - millis) / (1000 * 3600 * 24));
		return Math.abs(day) >= limit;
	}

	/**
	 * 计算指定的时间毫秒值与当前时间的毫秒值是否大于指定的天数
	 * @param date  指定的时间  yyyy-MM-dd HH:mm:ss
	 * @param limit 指定的天数
	 * @return true:大于等于指定天数
	 */
	public static boolean compareDay(String date, int limit) {

		return compareDay(date, Pattern.YYYY_MM_DD_HH_MM_SS, limit);

	}

	/**
	 * 计算指定的时间毫秒值与当前时间的毫秒值是否大于指定的天数
	 * @param date  指定的时间  yyyy-MM-dd HH:mm:ss
	 * @param limit 指定的天数
	 * @param pattern 指定格式
	 * @see Pattern
	 * @return true:大于等于指定天数
	 */
	public static boolean compareDay(String date, String pattern, int limit) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
		Date parse;
		try {
			parse = dateFormat.parse(date);
		} catch (ParseException e) {
			return true;
		}
		return compareDay(parse.getTime(), limit);

	}

	/**
	 * 计算指定的时间毫秒值与当前时间的毫秒值是否大于指定的天数
	 * 格式为：yyyy-MM-dd
	 * @param date
	 * @param limit
	 * @return true:大于等于指定天数
	 */
	public static boolean compareYMDDay(String date, int limit) {
		return compareDay(date, Pattern.YYYY_MM_DD, limit);
	}

	/**
	 * 获取当前日期在一年中的第几天
	 * @param calendar
	 * @return
	 */
	public static int getDayOfYear(Calendar calendar) {
		if (calendar == null) {
			return -1;
		}
		return calendar.get(Calendar.DAY_OF_YEAR);
	}

	/**
	 * 获取当前属于哪一年
	 * @param calendar
	 * @return
	 */
	public static int getYear(Calendar calendar) {
		if (calendar == null) {
			return -1;
		}
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 获取当前月属于哪一月
	 * @param calendar
	 * @return
	 */
	public static int getMonth(Calendar calendar) {
		if (calendar == null) {
			return -1;
		}
		return calendar.get(Calendar.MONTH);
	}

	/**
	 * 获取当前天属于一月中哪一天
	 * @param calendar
	 * @return
	 */
	public static int getDayOfMonth(Calendar calendar) {
		if (calendar == null) {
			return -1;
		}
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 比较时间是否相同  只比较年月日
	 * true 相同  flase 不同
	 * @param date
	 * @return
	 */
	public static boolean compareYMD(String date) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		Date parse;
		try {
			parse = dateFormat.parse(date);
		} catch (ParseException e) {
			return false;
		}
		Calendar assign = Calendar.getInstance();
		assign.setTime(parse);
		Calendar current = Calendar.getInstance();
		current.set(Calendar.HOUR_OF_DAY, 0);
		current.set(Calendar.MINUTE, 0);
		current.set(Calendar.SECOND, 0);
		current.set(Calendar.MILLISECOND, 0);
		return current.compareTo(assign) == 0;
	}

	/**
	 * 根据指定的时间格式字符串，获取该月最大的天数
	 * @param pattern
	 * @param timeStr
	 * @return
	 */
	public static int getMaxDaysOfTheMonth(String timeStr, String pattern) {
		Date date = string2Date(timeStr, pattern);
		if (date == null) {
			return -1;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.getActualMaximum(Calendar.DATE);
	}

	/**
	 * 判断时间是否在时间段内
	 * @param nowTime
	 * @param beginTime 开始时间
	 * @param endTime 结束时间
	 * @return
	 */
	public static boolean inPeriod(String nowTime, String beginTime, String endTime) {
		if (TextUtils.isEmpty(nowTime) || TextUtils.isEmpty(beginTime) || TextUtils.isEmpty(endTime)) {
			return false;
		}
		if (nowTime.compareTo(beginTime) >= 0 && nowTime.compareTo(endTime) <= 0) {
			return true;
		}
		return false;
	}

}
